/*
* 函数柯里化 多个参数的传入 转化成n个函数
*   一般 柯里化 参数要求 都是一个个的传
*   好处: 可以暂存变量
*/


function fn1(a) {
    return function (b) {
        return function (c) {

        }
    }
}
function fn2(a, b, c) {

}

// fn2(a,b,c)

// 判断一个变量的类型
// typeof 一般用来判断基础类型
// instanceof xxx 谁是谁的实例
// Object.prototype.toString.call 判断具体类型
// constructor 深拷贝


// function isType(val, typing) {
//     return Object.prototype.toString.call(val) === `[object ${typing}]`
// }

// 柯里化 : 让函数变得更具体
// 反柯里化: 让函数范围变得更大一些


function isType(typing) {
    return function (val) {
        return Object.prototype.toString.call(val) == `[object ${typing}]`
    }
}

let isString = isType('String')

console.log(isString('abc'))
console.log(isString(123))


// 实现通用的柯里化函数


/**
 * 我要记录每次调用时传入的参数
 * 并且和函数的参数个数进行比较
 * 如果不满足总个数 就返回新函数
 * 如果传入的个数和参数一致 执行原来的函数
 * @param a
 * @param b
 * @param c
 * @param d
 * @returns {*}
 */
function sum(a,b,c,d) {
    return a + b + c + d
}

let sum1 = curring(sum)
let sum2 = sum1(1)
let sum3 = sum2(2,3)
let result = sum3(4)

console.log(result)





